package com.ruyuan2020.im.xx;

import org.apache.commons.collections4.CollectionUtils;

import java.util.ArrayList;
import java.util.List;

/**
 * 在现代应用程序中，经常需要处理长时间运行的异步任务，如消息推送、定时任务等。
 * 为了确保这些异步任务能够安全可靠地执行，我们需要一种优雅的管理方式。
 * 本文将介绍一种基于线程池的多线程异步任务管理方案，并详细讨论任务的优雅关闭。
 *
 * 1. 多线程异步任务管理的需求
 * 在实际项目中，存在一些永动异步任务，需要一种灵活的管理方式。
 * 同时，每个异步任务应该支持多线程执行，以提高效率。
 * 任务的优雅关闭也是一个关键需求，以确保在关闭应用程序时，所有任务都能完成当前处理的数据。
 *
 * 2. 线程池的重要性
 * 为了支持多线程执行任务，我们选择使用线程池。线程池能够优雅地管理线程的生命周期，有效地重用线程资源，提高性能。
 * 在我们的方案中，通过 TaskManager 类实现线程池的初始化、获取和回收。
 *
 *
 * 3. 单个任务的实现
 * 为了实现一个单个异步任务，我们创建了 WorkerTask 类。
 * 该类负责获取数据、多线程处理数据、优雅关闭任务等操作。
 * 任务的关闭通过设置标志位来通知任务停止。
 *
 *
 *
 * 4. 任务入口与启动
 * 我们通过 TaskLooper 类来初始化和启动多个异步任务。
 * 该类负责创建任务实例，并使用线程启动它们。
 * 在实验中，我们模拟了一定的运行时间后，手动调用了关闭方法,当然如果不关闭那就 永动机 。
 *
 *
 */

/**
 * @author gaowei
 * @date 2025/3/5
 */
public class TaskLooper {
    private List<WorkerTask> workerTasks;

    // 初始化多个异步任务
    public void initializeTasks() {
        workerTasks = new ArrayList<>();
        workerTasks.add(new WorkerTask("task1"));
        workerTasks.add(new WorkerTask("task2"));
        for (final WorkerTask workerTask : workerTasks) {
            new Thread(workerTask::executeTask).start();
        }
    }

    // 关闭所有异步任务
    public void shutdownTasks() {
        if (!CollectionUtils.isEmpty(workerTasks)) {
            for (WorkerTask workerTask : workerTasks) {
                workerTask.shutdownTask();
            }
        }
    }

    // 主程序入口
    public static void main(String[] args) throws Exception {
        TaskLooper taskLooper = new TaskLooper();
        taskLooper.initializeTasks();
        Thread.sleep(3000L);
        taskLooper.shutdownTasks();
    }
}